Various types of objects may be stored in a data storage system. For example, in a file storage system, a file server may store various types of system objects (e.g., a root directory object, a free block bitmap object, etc.) as well as various types of user objects (e.g., user data files). Objects may be stored using tree structures having a root node that points to various other structures, such as storage blocks that contain content, direct nodes that point to storage blocks, or indirect nodes that point to other indirect nodes or to direct nodes. Among other things, tree structures allow objects to expand and contract, e.g., by respectively adding and removing nodes. Ultimately, objects are stored in one or more storage devices, such as disk drives.
One type of object that may be used in a data storage system is an indirection object that provides pointers to the root nodes of the various objects stored in the storage system. The indirection object may be logically organized as a table that can be indexed by object number in order to access, among other things, a pointer to the root node of the corresponding object. Like other objects, the indirection object may be stored using a tree structure and therefore can expand as more objects are created in the storage system.
In order to prevent the indirection object from expanding unnecessarily, the object numbers of deleted objects (and therefore the corresponding table entries in the indirection object) may be re-used as new objects are added to the storage system. Thus, a list of available object numbers is typically maintained in the storage system. For various reasons, it may be necessary or desirable to verify the indirection object, including the list of available object numbers, from time to time in order to ensure that all free object numbers are included in the free object number list and that no “used” object numbers are included in the free object number list.